home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1993 / 5 / 04b / funktionsplotter / fplotter.ampk / Renderer / TXT / FunctionPlotter.mod < prev    next >
Encoding:
Text File  |  1995-06-01  |  27.0 KB  |  846 lines

  1. |##########|
  2. |#MAGIC   #|BOPDNOKB
  3. |#PROJECT #|"FunctionPlotter"
  4. |#PATHS   #|"EGSProject"
  5. |#FLAGS   #|xx---x--x---x-x-x---------------
  6. |#USERSW  #|--------------------------------
  7. |#USERMASK#|--------------------------------
  8. |#SWITCHES#|xx---xxxxx-xx---
  9. |##########|
  10.  
  11. MODULE FunctionPlotter;
  12.  
  13. FROM EGSIntui   AS I   IMPORT WindowGrp,MessageGrp;
  14. FROM EGSGadBox  AS GB  IMPORT GadBoxPtr,GadContext;
  15. FROM EGSGfx     AS G   IMPORT EFontPtr;
  16. FROM T_Dos             IMPORT OpenErr;
  17. FROM EGS               IMPORT CLUEntry,BitMapGrp;
  18. FROM Render     AS r   IMPORT FuncParams,DrawParams,RenderFunction,CheckFunction,
  19.                               AxisMove,DrawModes,LightDirs;
  20. FROM Intuition         IMPORT okCancel;
  21.                        IMPORT Exec;
  22. FROM Strings           IMPORT Str;
  23. FROM DosSupport        IMPORT SubDir;
  24. FROM EGSIFF            IMPORT OpenOutPic,CloseOutPic,SaveMap;
  25.  
  26. IMPORT GBMenuSelect AS GM;
  27. IMPORT GBRadio      AS GR;
  28. IMPORT GBScrollBox  AS GS;
  29. IMPORT GBColorPot   AS GC;
  30. FROM EGSRequest        IMPORT FileRequestPtr,SimpleRequestPtr,
  31.                               ReqContextPtr,
  32.                               CreateReqContext,
  33.                               DeleteReqContext,
  34.                               DoRequest,
  35.                               CreateFileReq,
  36.                               CreateSimpleReq;
  37.  
  38. CONST
  39.   GID_FuncStr     = $10000;
  40.   GID_MinX        = $20000;
  41.   GID_MaxX        = $20001;
  42.   GID_MinY        = $20002;
  43.   GID_MaxY        = $20003;
  44.   GID_MinZ        = $20004;
  45.   GID_MaxZ        = $20005;
  46.   GID_Resolution  = $30000;
  47.   GID_FuncColor   = $40000;
  48.   GID_BackColor   = $40001;
  49.   GID_Light       = $50000;
  50.   GID_StdFuncs    = $60000;
  51.   GID_DrawMode    = $70000;
  52.   GID_OutLines    = $80000;
  53.   GID_Mirror      = $80001;
  54.   GID_Specular    = $80002;
  55.   GID_Shadows     = $80003;
  56.   GID_Pitch       = $A0000;
  57.   GID_Bearing     = $A0001;
  58.   GID_Render      = $B0000;
  59.   GID_Stop        = $B0001;
  60.  
  61.   MID_Save        = $11000;
  62.   MID_About       = $12000;
  63.   MID_Quit        = $13000;
  64.  
  65.   LightNames      = GB.StrArray:("Top","Front","Left","Right",NIL);
  66.   DrawModeNames   = GB.StrArray:("Wireframe","Solid","Shaded","Traced",NIL);
  67.  
  68.   RealField       = 7;
  69.   Digits          = 4;
  70.  
  71. TYPE
  72.   StdFNodePtr     = POINTER TO StdFNode;
  73.   StdFNode        = RECORD OF Exec.Node;
  74.                       minX,maxX : LONGREAL;
  75.                       minY,maxY : LONGREAL;
  76.                       minZ,maxZ : LONGREAL;
  77.                     END;
  78.  
  79. EXCEPTION
  80.   NoGadSolution  : "Could not create gadgets";
  81.   GadgetNotFound : "Gadget not found";
  82.   NoMenu         : "Could not create menu";
  83.  
  84. VAR
  85.   Win         : WindowPtr;
  86.   DrawArea    : GB.ResBox;
  87.   GCon        : GadContext;
  88.   WFont       : EFontPtr;
  89.  
  90.   StdFList    : Exec.List;
  91.  
  92.   CurrentFunc := FuncParams:(funcStr="0",
  93.                              minX=-1.0,maxX=1.0,
  94.                              minY=-1.0,maxY=1.0,
  95.                              minZ=-1.0,maxZ=1.0);
  96.  
  97.   CurrentDraw := DrawParams:(mode=wire,
  98.                              light=left,
  99.                              outlined=FALSE,
  100.                              resolution=5,
  101.                              fColor=($00,$00,$FF),
  102.                              bColor=($AA,$AA,$AA),
  103.                              pitch=0,
  104.                              bearing=0);
  105.  
  106.   Menu        : I.MenuPtr;
  107.   MenuFont    : G.EFontPtr;
  108.  
  109. PROCEDURE InitStdFuncs;
  110. CONST
  111.   FNodes = ARRAY OF StdFNode:((name="sin(4*(sin(x)+sin(y)))",
  112.                                minX=-6,maxX=6,
  113.                                minY=-6,maxY=6,
  114.                                minZ=-8,maxZ=8),
  115.                               (name="sin(2*exp(-4*(x*x+y*y)))/2",
  116.                                minX=-1,maxX=1,
  117.                                minY=-1,maxY=1,
  118.                                minZ=-1,maxZ=1),
  119.                               (name="cos(x*y*12)/6",
  120.                                minX=-1,maxX=1,
  121.                                minY=-1,maxY=1,
  122.                                minZ=-1,maxZ=1),
  123.                               (name="sqrt(abs(1.0-abs(1.0-abs(1.0-abs(x*y+1.0)))))",
  124.                                minX=-4,maxX=4,
  125.                                minY=-4,maxY=4,
  126.                                minZ=-4,maxZ=4),
  127.                               (name="sqrt(abs(1.0-abs(1.0-abs(1.0-abs(x*y+0.5)))))",
  128.                                minX=-2,maxX=2,
  129.                                minY=-2,maxY=2,
  130.                                minZ=-2,maxZ=2),
  131.                               (name="cos(sqrt(x*x+y*y)*14)*exp(-2*(x*x+y*y))/2",
  132.                                minX=-1,maxX=1,
  133.                                minY=-1,maxY=1,
  134.                                minZ=-1,maxZ=1),
  135.                               (name="cos(atan(x/y)*sgn(y)*8)/4*sin(sqrt(x*x+y*y)*3)",
  136.                                minX=-1,maxX=1,
  137.                                minY=-1.001,maxY=1,
  138.                                minZ=-1,maxZ=1),
  139.                               (name="abs(sin(x*4)+sin(y*4))/4+cos(sqrt(x*x+y*y)*16)/16",
  140.                                minX=-1,maxX=1,
  141.                                minY=-1,maxY=1,
  142.                                minZ=-1,maxZ=1));
  143. VAR i : INTEGER;
  144. BEGIN
  145.   Exec.NewList(StdFList,Exec.unknown);
  146.   FOR i:=0 TO FNodes'MAX DO
  147.     Exec.AddTail(StdFList'PTR,FNodes[i]'PTR);
  148.   END;
  149. END InitStdFuncs;
  150.  
  151.  
  152. PROCEDURE CreateGadgets;
  153.  
  154. VAR
  155.   root : GadBoxPtr;
  156.  
  157.  
  158.   PROCEDURE LinkGadgets(from,to : LONGINT);
  159.   BEGIN
  160.     ASSERT(GB.LinkStringGadgetsID(GCon,from,to,
  161.                                   I.MasterGadPtr(GCon.first).firstSon,
  162.                                   I.MasterGadPtr(GCon.first).numSons),GadgetNotFound);
  163.  
  164.  
  165.   END LinkGadgets;
  166.  
  167.  
  168.   PROCEDURE CreatePictureBox():GadBoxPtr;
  169.   BEGIN
  170.     RETURN    GB.CreateGroupBorder(GCon,
  171.                 GB.CreateVertiTableL(GCon,
  172.                   GB.CreateHorizBoxL(GCon,
  173.                     GB.CreateBackBorder(GCon,
  174.                       GB.CreateResponseBox(GCon,DrawArea,200,GB.max,100,GB.max),{}),
  175.                     GB.CreateHorizFill(GCon,FALSE,0),
  176.                     GB.NewPri(GB.CreateSuperVertiProp(GCon,95,5,0,GID_Pitch,{GB.aDecBR,GB.aIncBR}),-1)
  177.                   ),
  178.                   GB.CreateVertiFill(GCon,FALSE,0),
  179.                   GB.NewPri(
  180.                     GB.CreateHorizBoxL(GCon,
  181.                       GB.CreateSuperHorizProp(GCon,185,5,90,GID_Bearing,{GB.aDecBR,GB.aIncBR}),
  182.                       GB.CreateHorizFill(GCon,FALSE,0),
  183.                       GB.CreateFillBox(GCon,-1)
  184.                     ),-1
  185.                   )
  186.                 ),{}," Picture "
  187.               );
  188.   END CreatePictureBox;
  189.  
  190.   PROCEDURE CreateRangeBox():GadBoxPtr;
  191.   BEGIN
  192.     RETURN  GB.CreateGroupBorder(GCon,
  193.               GB.CreateVertiTableL(GCon,
  194.                 GB.CreateHorizBoxL(GCon,
  195.                   GB.CreateFillBox(GCon,0),
  196.                   GB.CreateHorizFill(GCon,FALSE,0),
  197.                   GB.CreateCenterText(GCon,"min"),
  198.                   GB.CreateHorizFill(GCon,FALSE,0),
  199.                   GB.CreateCenterText(GCon,"max")
  200.                 ),
  201.                 GB.CreateVertiFill(GCon,TRUE,1),
  202.                 GB.CreateHorizBoxL(GCon,
  203.                   GB.CreateText(GCon,"x"),
  204.                   GB.CreateHorizFill(GCon,FALSE,0),
  205.                   GB.CreateDoubleBorder(GCon,
  206.                     GB.CreateRealGadget(GCon,4,10,GID_MinX),{}
  207.                   ),
  208.                   GB.CreateHorizFill(GCon,FALSE,0),
  209.                   GB.CreateDoubleBorder(GCon,
  210.                     GB.CreateRealGadget(GCon,4,10,GID_MaxX),{}
  211.                   )
  212.                 ),
  213.                 GB.CreateVertiFill(GCon,TRUE,1),
  214.                 GB.CreateHorizBoxL(GCon,
  215.                   GB.CreateText(GCon,"y"),
  216.                   GB.CreateHorizFill(GCon,FALSE,0),
  217.                   GB.CreateDoubleBorder(GCon,
  218.                     GB.CreateRealGadget(GCon,4,10,GID_MinY),{}
  219.                   ),
  220.                   GB.CreateHorizFill(GCon,FALSE,0),
  221.                   GB.CreateDoubleBorder(GCon,
  222.                     GB.CreateRealGadget(GCon,4,10,GID_MaxY),{}
  223.                   )
  224.                 ),
  225.                 GB.CreateVertiFill(GCon,TRUE,1),
  226.                 GB.CreateHorizBoxL(GCon,
  227.                   GB.CreateText(GCon,"z"),
  228.                   GB.CreateHorizFill(GCon,FALSE,0),
  229.                   GB.CreateDoubleBorder(GCon,
  230.                     GB.CreateRealGadget(GCon,4,10,GID_MinZ),{}
  231.                   ),
  232.                   GB.CreateHorizFill(GCon,FALSE,0),
  233.                   GB.CreateDoubleBorder(GCon,
  234.                     GB.CreateRealGadget(GCon,4,10,GID_MaxZ),{}
  235.                   )
  236.                 )
  237.               ),GB.AllFill," Range "
  238.             );
  239.   END CreateRangeBox;
  240.  
  241.   PROCEDURE CreateColorBox():GadBoxPtr;
  242.   BEGIN
  243.     RETURN  GB.CreateGroupBorder(GCon,
  244.               GB.CreateVertiBoxL(GCon,
  245.                 GM.CreateMenuGadget(GCon,GID_Light,LightNames'PTR),
  246.                 GB.CreateVertiFill(GCon,TRUE,-1),
  247.                 GB.CreateHorizBoxL(GCon,
  248.                   GC.CreateColorPotGadget(GCon,GID_FuncColor,0,0,255),
  249.                   GB.CreateHorizFill(GCon,FALSE,-1),
  250.                   GB.CreateText(GCon,"Function"),
  251.                   GB.CreateHorizFill(GCon,TRUE,1)
  252.                 ),
  253.                 GB.CreateVertiFill(GCon,TRUE,-1),
  254.                 GB.CreateHorizBoxL(GCon,
  255.                   GC.CreateColorPotGadget(GCon,GID_BackColor,0,0,0),
  256.                   GB.CreateHorizFill(GCon,FALSE,-1),
  257.                   GB.CreateText(GCon,"Background"),
  258.                   GB.CreateHorizFill(GCon,TRUE,1)
  259.                 ),
  260.                 GB.CreateFillBox(GCon,1)
  261.               ),{}," Color "
  262.             );
  263.   END CreateColorBox;
  264.  
  265.   PROCEDURE CreateDrawModeBox():GadBoxPtr;
  266.   BEGIN
  267.     RETURN  GB.CreateGroupBorder(GCon,
  268.               GR.CreateRadioGadget(GCon,DrawModeNames'PTR,100,GID_DrawMode),
  269.               {}," DrawMode "
  270.             );
  271.   END CreateDrawModeBox;
  272.  
  273.   PROCEDURE CreateFlagBox():GadBoxPtr;
  274.  
  275.     PROCEDURE CreateFlag(REF name : STRING;id : LONGINT):GadBoxPtr;
  276.     BEGIN
  277.       RETURN  GB.CreateHorizBoxL(GCon,
  278.                 GB.CreateCheckmarkGadget(GCon,id),
  279.                 GB.CreateHorizFill(GCon,FALSE,-1),
  280.                 GB.CreateText(GCon,name),
  281.                 GB.CreateHorizFill(GCon,TRUE,1)
  282.               );
  283.     END CreateFlag;
  284.  
  285.   BEGIN
  286.     RETURN  GB.CreateGroupBorder(GCon,
  287.               GB.CreateVertiTableL(GCon,
  288.                 CreateFlag("Outlined",GID_OutLines),
  289.                 GB.CreateVertiFill(GCon,FALSE,0),
  290.                 CreateFlag("Mirror",GID_Mirror),
  291.                 GB.CreateVertiFill(GCon,FALSE,0),
  292.                 CreateFlag("Specular",GID_Specular),
  293.                 GB.CreateVertiFill(GCon,FALSE,0),
  294.                 CreateFlag("Shadows",GID_Shadows),
  295.                 GB.CreateFillBox(GCon,1)
  296.               ),{}," Flags "
  297.             );
  298.   END CreateFlagBox;
  299.  
  300.   PROCEDURE CreateAction():GadBoxPtr;
  301.   BEGIN
  302.     RETURN GB.CreateVertiBoxL(GCon,
  303.              GB.CreateTextAction(GCon,"_Render",GID_Render,{}),
  304.              GB.CreateVertiFill(GCon,FALSE,0),
  305.              GB.CreateTextAction(GCon,"_Stop",GID_Stop,{})
  306.            );
  307.   END CreateAction;
  308.  
  309.   PROCEDURE CreateResolutionBox():GadBoxPtr;
  310.   BEGIN
  311.     RETURN GB.CreateGroupBorder(GCon,
  312.              GB.CreateHorizProp(GCon,6,1,5,GID_Resolution),{}," Resolution ");
  313.  
  314.   END CreateResolutionBox;
  315.  
  316. BEGIN
  317.   GCon:=GB.CreateGadContext(NIL,NIL,-1,-1);
  318.   root:=GB.CreateMasterWindow(GCon,Win,
  319.           GB.CreateVertiBoxL(GCon,
  320.             GB.NewPri(
  321.               GB.CreateHorizBoxL(GCon,
  322.  
  323.                 GB.NewPri(CreatePictureBox(),1),
  324.  
  325.                 GB.CreateHorizFill(GCon,FALSE,0),
  326.                 GB.CreateVertiBoxL(GCon,
  327.                   GB.CreateHorizBoxL(GCon,
  328.                     GB.CreateVertiBoxL(GCon,
  329.                       CreateRangeBox(),
  330.                       GB.CreateVertiFill(GCon,TRUE,-1),
  331.  
  332.                       CreateDrawModeBox()
  333.  
  334.                     ),
  335.                     GB.CreateHorizFill(GCon,TRUE,-1),
  336.                     GB.CreateVertiBoxL(GCon,
  337.  
  338.                       CreateColorBox(),
  339.  
  340.                       GB.CreateVertiFill(GCon,FALSE,0),
  341.  
  342.                       CreateResolutionBox(),
  343.  
  344.                       GB.CreateVertiFill(GCon,FALSE,0),
  345.  
  346.                       CreateFlagBox()
  347.  
  348.                     )
  349.                   ),
  350.                   GB.CreateFillBox(GCon,1)
  351.                 )
  352.               ),1
  353.             ),
  354.             GB.CreateVertiFill(GCon,FALSE,0),
  355.             GB.CreateNameStringGadget(GCon,"f(x,y)",40,200,I.justifyLeft,GID_FuncStr),
  356.             GB.CreateVertiFill(GCon,FALSE,0),
  357.             GB.CreateHorizBoxL(GCon,
  358.               GS.CreateLateScrollBox(GCon,40,200,4,8,FALSE,GID_StdFuncs),
  359.               GB.CreateHorizFill(GCon,FALSE,0),
  360.  
  361.               CreateAction()
  362.  
  363.             )
  364.           )
  365.         );
  366.   ASSERT(GB.ProcessGadBoxes(GCon,root),NoGadSolution);
  367.   LinkGadgets(GID_MinX,GID_MaxX);
  368.   LinkGadgets(GID_MaxX,GID_MinY);
  369.   LinkGadgets(GID_MinY,GID_MaxY);
  370.   LinkGadgets(GID_MaxY,GID_MinZ);
  371.   LinkGadgets(GID_MinZ,GID_MaxZ);
  372.   LinkGadgets(GID_MaxZ,GID_MinX);
  373. END CreateGadgets;
  374.  
  375.  
  376.  
  377. PROCEDURE FindGadget(id : LONGINT):I.GadgetPtr;
  378. VAR gad : I.GadgetPtr;
  379. BEGIN
  380.   gad:=GB.FindGadget(I.MasterGadPtr(GCon.first).firstSon,
  381.                      I.MasterGadPtr(GCon.first).numSons,id);
  382.   ASSERT(gad#NIL,GadgetNotFound);
  383.   RETURN gad;
  384. END FindGadget;
  385.  
  386. PROCEDURE SetBoolGadStates(win : WindowPtr := NIL);
  387. TYPE
  388.   BoolGadSet = SET OF [GID_OutLines..GID_Shadows];
  389.  
  390.   PROCEDURE SetOnOff(set : BoolGadSet);
  391.   VAR i : LONGINT;
  392.   BEGIN
  393.     FOR i:=GID_OutLines TO GID_Shadows DO
  394.       IF i IN set THEN
  395.         I.OnGadget(win,FindGadget(i));
  396.       ELSE
  397.         I.OffGadget(win,FindGadget(i));
  398.       END;
  399.     END;
  400.   END SetOnOff;
  401.  
  402. BEGIN
  403.   IF KEY CurrentDraw.mode
  404.     OF wire THEN
  405.       SetOnOff({});
  406.     END
  407.     OF solid THEN
  408.       SetOnOff({GID_OutLines});
  409.     END
  410.     OF shaded THEN
  411.       SetOnOff({GID_OutLines,GID_Specular});
  412.     END
  413.     OF traced THEN
  414.       SetOnOff({GID_Specular,GID_Mirror,GID_Shadows});
  415.     END
  416.   END;
  417. END SetBoolGadStates;
  418.  
  419. PROCEDURE OnGadgets(win  : WindowPtr;
  420.                     gads : LIST OF LONGINT);
  421. VAR i : INTEGER;
  422. BEGIN
  423.   FOR i:=0 TO gads'MAX DO
  424.     I.OnGadget(win,FindGadget(gads[i]));
  425.   END;
  426. END OnGadgets;
  427.  
  428. PROCEDURE OffGadgets(win  : WindowPtr;
  429.                     gads : LIST OF LONGINT);
  430. VAR i : INTEGER;
  431. BEGIN
  432.   FOR i:=0 TO gads'MAX DO
  433.     I.OffGadget(win,FindGadget(gads[i]));
  434.   END;
  435. END OffGadgets;
  436.  
  437. PROCEDURE RenderMode(win : WindowPtr := NIL);
  438. BEGIN
  439.   OffGadgets(win,GID_FuncStr,
  440.                  GID_MinX,GID_MaxX,
  441.                  GID_MinY,GID_MaxY,
  442.                  GID_MinZ,GID_MaxZ,
  443.                  GID_Resolution,
  444.                  GID_FuncColor,GID_BackColor,
  445.                  GID_Light,
  446.                  GID_StdFuncs,
  447.                  GID_DrawMode,
  448.                  GID_OutLines,
  449.                  GID_Mirror,
  450.                  GID_Specular,
  451.                  GID_Shadows,
  452.                  GID_Pitch,
  453.                  GID_Bearing,
  454.                  GID_Render);
  455.   OnGadgets(win,GID_Stop);
  456. END RenderMode;
  457.  
  458. PROCEDURE EditMode(win : WindowPtr := NIL);
  459. BEGIN
  460.   OnGadgets(win,GID_FuncStr,
  461.                 GID_MinX,GID_MaxX,
  462.                 GID_MinY,GID_MaxY,
  463.                 GID_MinZ,GID_MaxZ,
  464.                 GID_Resolution,
  465.                 GID_FuncColor,GID_BackColor,
  466.                 GID_Light,
  467.                 GID_StdFuncs,
  468.                 GID_DrawMode,
  469.                 GID_Pitch,
  470.                 GID_Bearing,
  471.                 GID_Render);
  472.   OffGadgets(win,GID_Stop);
  473.   SetBoolGadStates(win);
  474. END EditMode;
  475.  
  476. PROCEDURE PutGadValues(win : WindowPtr:=NIL);
  477. BEGIN
  478.   TRACK
  479.     I.LockIntuition;
  480.     WITH CurrentFunc AS f DO
  481.       GB.PutStringData(win,FindGadget(GID_FuncStr),f.funcStr);
  482.       GB.PutRealData(win,FindGadget(GID_MinX),f.minX,RealField,Digits,FALSE);
  483.       GB.PutRealData(win,FindGadget(GID_MaxX),f.maxX,RealField,Digits,FALSE);
  484.       GB.PutRealData(win,FindGadget(GID_MinY),f.minY,RealField,Digits,FALSE);
  485.       GB.PutRealData(win,FindGadget(GID_MaxY),f.maxY,RealField,Digits,FALSE);
  486.       GB.PutRealData(win,FindGadget(GID_MinZ),f.minZ,RealField,Digits,FALSE);
  487.       GB.PutRealData(win,FindGadget(GID_MaxZ),f.maxZ,RealField,Digits,FALSE)
  488.     END;
  489.     WITH CurrentDraw AS d DO
  490.       GR.ModifyRadioGadget(win,FindGadget(GID_DrawMode),INTEGER(d.mode));
  491.       GM.ModifyMenuGadget(win,FindGadget(GID_Light),INTEGER(d.light));
  492.       I.BoolGadPtr(FindGadget(GID_OutLines)).flag:=d.outlined;
  493.       I.BoolGadPtr(FindGadget(GID_Mirror)).flag:=d.mirror;
  494.       I.BoolGadPtr(FindGadget(GID_Specular)).flag:=d.specular;
  495.       I.BoolGadPtr(FindGadget(GID_Shadows)).flag:=d.shadows;
  496.       I.PropGadPtr(FindGadget(GID_Resolution)).value:=d.resolution-2;
  497.  
  498.       GC.ModifyColorPotGadget(win,FindGadget(GID_FuncColor),d.fColor.red,
  499.                                                             d.fColor.green,
  500.                                                             d.fColor.blue);
  501.       GC.ModifyColorPotGadget(win,FindGadget(GID_BackColor),d.bColor.red,
  502.                                                             d.bColor.green,
  503.                                                             d.bColor.blue);
  504.  
  505.       GB.SPropGadPtr(FindGadget(GID_Pitch)).realProp.value:=d.pitch;
  506.       INCL(GB.SPropGadPtr(FindGadget(GID_Pitch)).realProp.propflags,I.propFollow);
  507.       GB.SPropGadPtr(FindGadget(GID_Bearing)).realProp.value:=INTEGER(d.bearing)+90;
  508.       INCL(GB.SPropGadPtr(FindGadget(GID_Bearing)).realProp.propflags,I.propFollow);
  509.     END;
  510.     EditMode(win);
  511.     GS.AddListToScrollBox(win,FindGadget(GID_StdFuncs),StdFList'PTR);
  512.     IF win # NIL THEN
  513.       I.RefreshGadget(win,win.firstGadget);
  514.     END;
  515.   CLOSE
  516.     I.UnlockIntuition;
  517.   END;
  518. END PutGadValues;
  519.  
  520. PROCEDURE RemGadValues(win : WindowPtr := NIL);
  521. BEGIN
  522.   GS.RemListFromScrollBox(win,FindGadget(GID_StdFuncs),StdFList'PTR);
  523. END RemGadValues;
  524.  
  525.  
  526. PROCEDURE HandleGadgets(msg : EIntuiMsgPtr);
  527. VAR
  528.   pos      : INTEGER;
  529.   oldFPen,
  530.   oldBPen  : LONGINT;
  531.   rg       : I.RealGadPtr;
  532.   val      : LONGREAL;
  533.   id       : LONGINT;
  534.   fnode    : StdFNodePtr;
  535.  
  536.   PROCEDURE CheckBreak():BOOLEAN;
  537.   VAR
  538.     msg : EIntuiMsgPtr;
  539.   BEGIN
  540.     msg:=GetMsg(Win.port);
  541.     WHILE msg # NIL DO
  542.       IF msg.class=EIDCMPFlagSet:{iGadget} THEN
  543.         IF I.GadgetPtr(msg.iAddress).id=GID_Stop THEN
  544.           ReplyMsg(msg);
  545.           RETURN TRUE;
  546.         END
  547.       OR_IF msg.class=EIDCMPFlagSet:{iSizeVerify} THEN
  548.         msg.code:=okCancel;
  549.       END;
  550.       ReplyMsg(msg);
  551.       msg:=GetMsg(Win.port);
  552.     END;
  553.     RETURN FALSE;
  554.   END CheckBreak;
  555.  
  556. BEGIN
  557.   WITH I.GadgetPtr(msg.iAddress) AS g DO
  558.     IF KEY g.id
  559.       OF GID_FuncStr THEN
  560.         GB.GetStringData(g,CurrentFunc.funcStr);
  561.         pos:=CheckFunction(CurrentFunc.funcStr);
  562.         IF pos#-1 THEN
  563.           TRACK
  564.             I.LockIntuition;
  565.             I.StringGadPtr(g).bufferPos:=pos;
  566.             I.ActivateGadget(Win,g,FALSE);
  567.           CLOSE
  568.             I.UnlockIntuition;
  569.           END
  570.         END;
  571.       END;
  572.       OF GID_Render THEN
  573.         oldFPen:=CurrentDraw.fPen;
  574.         oldBPen:=CurrentDraw.bPen;
  575.         CurrentDraw.fPen:=I.ObtainColor(Win.screen,
  576.                                         CurrentDraw.fColor.red,
  577.                                         CurrentDraw.fColor.green,
  578.                                         CurrentDraw.fColor.blue);
  579.         CurrentDraw.bPen:=I.ObtainColor(Win.screen,
  580.                                         CurrentDraw.bColor.red,
  581.                                         CurrentDraw.bColor.green,
  582.                                         CurrentDraw.bColor.blue);
  583.         I.SetPointer(Win,I.GetPrefPointer(I.WorkingMouse));
  584.         RenderMode(Win);
  585.         RenderFunction(Win.rPort,DrawArea,
  586.                        CurrentFunc,CurrentDraw,CheckBreak);
  587.         EditMode(Win);
  588.         I.SetPointer(Win,I.GetPrefPointer(I.StandardMouse));
  589.  
  590.         I.ReleaseColor(Win.screen,oldFPen);
  591.         I.ReleaseColor(Win.screen,oldBPen);
  592.       END;
  593.       OF GID_DrawMode THEN
  594.         CurrentDraw.mode:=DrawModes(GR.RadioGadPtr(g).selected);
  595.         SetBoolGadStates(Win);
  596.       END
  597.       OF GID_Light THEN
  598.         CurrentDraw.light:=LightDirs(GM.MenuGadPtr(g).sel);
  599.       END
  600.       OF GID_OutLines THEN
  601.         CurrentDraw.outlined:=I.BoolGadPtr(g).flag;
  602.       END
  603.       OF GID_Mirror THEN
  604.         CurrentDraw.mirror:=I.BoolGadPtr(g).flag;
  605.       END
  606.       OF GID_Specular THEN
  607.         CurrentDraw.specular:=I.BoolGadPtr(g).flag;
  608.       END
  609.       OF GID_Shadows THEN
  610.         CurrentDraw.shadows:=I.BoolGadPtr(g).flag;
  611.       END
  612.       OF GID_FuncColor THEN
  613.         CurrentDraw.fColor:=GC.ColorPotGadPtr(g).color;
  614.       END
  615.       OF GID_BackColor THEN
  616.         CurrentDraw.bColor:=GC.ColorPotGadPtr(g).color;
  617.       END
  618.       OF GID_MinX..GID_MaxZ THEN
  619.         id:=GID_MinX;
  620.         REPEAT
  621.           rg:=FindGadget(id);
  622.           IF rg.valid THEN
  623.             IF KEY id
  624.               OF GID_MinX THEN CurrentFunc.minX:=rg.value END;
  625.               OF GID_MaxX THEN CurrentFunc.maxX:=rg.value END;
  626.               OF GID_MinY THEN CurrentFunc.minY:=rg.value END;
  627.               OF GID_MaxY THEN CurrentFunc.maxY:=rg.value END;
  628.               OF GID_MinZ THEN CurrentFunc.minZ:=rg.value END;
  629.               OF GID_MaxZ THEN CurrentFunc.maxZ:=rg.value END;
  630.             END;
  631.             INC(id);
  632.           ELSE
  633.             I.ActivateGadget(Win,rg,FALSE);
  634.             id:=SUCC(GID_MaxZ);
  635.           END;
  636.         UNTIL id>GID_MaxZ;
  637.       END
  638.       OF GID_Pitch THEN
  639.         AxisMove(Win.rPort,DrawArea,CurrentDraw,
  640.                  GB.SPropGadPtr(g).realProp.value,
  641.                  CurrentDraw.bearing);
  642.       END;
  643.       OF GID_Bearing THEN
  644.         AxisMove(Win.rPort,DrawArea,CurrentDraw,
  645.                  CurrentDraw.pitch,
  646.                  GB.SPropGadPtr(g).realProp.value-90);
  647.       END;
  648.       OF GID_Resolution THEN
  649.         CurrentDraw.resolution:=I.PropGadPtr(g).value+2
  650.       END
  651.       OF GID_StdFuncs THEN
  652.         fnode:=GS.ScrollGadPtr(g).actText;
  653.         IF (fnode#NIL) AND (fnode.succ#NIL) THEN
  654.           WITH CurrentFunc AS f DO
  655.             f.funcStr:=Str(fnode.name);
  656.             f.minX:=fnode.minX;
  657.             f.maxX:=fnode.maxX;
  658.             f.minY:=fnode.minY;
  659.             f.maxY:=fnode.maxY;
  660.             f.minZ:=fnode.minZ;
  661.             f.maxZ:=fnode.maxZ;
  662.             GB.PutStringData(Win,FindGadget(GID_FuncStr),f.funcStr);
  663.             GB.PutRealData(Win,FindGadget(GID_MinX),f.minX,RealField,Digits,FALSE);
  664.             GB.PutRealData(Win,FindGadget(GID_MaxX),f.maxX,RealField,Digits,FALSE);
  665.             GB.PutRealData(Win,FindGadget(GID_MinY),f.minY,RealField,Digits,FALSE);
  666.             GB.PutRealData(Win,FindGadget(GID_MaxY),f.maxY,RealField,Digits,FALSE);
  667.             GB.PutRealData(Win,FindGadget(GID_MinZ),f.minZ,RealField,Digits,FALSE);
  668.             GB.PutRealData(Win,FindGadget(GID_MaxZ),f.maxZ,RealField,Digits,FALSE)
  669.           END;
  670.         END;
  671.       END
  672.     END
  673.   END;
  674. END HandleGadgets;
  675.  
  676.  
  677. VAR
  678.   Msg    : EIntuiMsgPtr;
  679.   done   : BOOLEAN;
  680.   tmpRas : EBitMapPtr;
  681.   Freq   : FileRequestPtr;
  682.   Failed,
  683.   About  : SimpleRequestPtr;
  684.   RCon   : ReqContextPtr;
  685.  
  686. PROCEDURE HandleMenus(msg : EIntuiMsgPtr);
  687. BEGIN
  688.   IF KEY I.MenuItemPtr(msg.iAddress).id
  689.     OF MID_Save THEN
  690.       IF CurrentDraw.renderMap#NIL THEN
  691.         I.SleepWindow(Win);
  692.         I.SetPointer(Win,I.GetPrefPointer(I.SleepMouse));
  693.         IF DoRequest(Freq) THEN
  694.           TRY
  695.             OpenOutPic(SubDir(Freq.path,Freq.name),ilbm:=TRUE);
  696.             I.SetPointer(Win,I.GetPrefPointer(I.DiskWriteMouse));
  697.             SaveMap(CurrentDraw.renderMap,ilbm:=TRUE);
  698.             CloseOutPic;
  699.           EXCEPT
  700.             OF OpenErr THEN
  701.               FORGET DoRequest(Failed);
  702.             END
  703.           END
  704.         END;
  705.         I.SetPointer(Win,I.GetPrefPointer(I.StandardMouse));
  706.         I.WakeWindow(Win);
  707.       END;
  708.     END
  709.     OF MID_About THEN
  710.       I.SleepWindow(Win);
  711.       I.SetPointer(Win,I.GetPrefPointer(I.SleepMouse));
  712.       FORGET DoRequest(About);
  713.       I.SetPointer(Win,I.GetPrefPointer(I.StandardMouse));
  714.       I.WakeWindow(Win);
  715.     END
  716.     OF MID_Quit THEN
  717.       done:=TRUE
  718.     END
  719.   END;
  720. END HandleMenus;
  721.  
  722. BEGIN
  723.   InitStdFuncs;
  724.   RCon:=CreateReqContext();
  725.   Freq:=CreateFileReq(RCon);
  726.   Failed:=CreateSimpleReq(RCon,
  727.                           "Bild konnte nicht|"+
  728.                           "gesichert werden",
  729.                           "ok");
  730.   About:=CreateSimpleReq(RCon,
  731.                          "Funktionsplotter|"+
  732.                          "© 1993 U.Sigmund",
  733.                          "ja,ja mir wisses");
  734.  
  735.   MenuFont:=G.OpenFont(I.GetPrefFont(I.windowFont));
  736.   ASSERT(MenuFont#NIL,NoMenu);
  737.   Menu:=I.CreateMenuL(
  738.           I.CreateItemL(MenuFont,"Project",sub:=
  739.             I.CreateLeave(),
  740.             I.CreateItem(MenuFont,"Save",MID_Save,"S",FALSE),
  741.             NIL,
  742.             I.CreateItem(MenuFont,"About",MID_About,"A",FALSE),
  743.             I.CreateItem(MenuFont,"Quit",MID_Quit,"Q",FALSE)
  744.           )
  745.         );
  746.   ASSERT(Menu#NIL,NoMenu);
  747.  
  748.   CreateGadgets;
  749.   WITH GCon.newWin AS w DO
  750.     UNI(w.flags,WindowFlagSet:{WindowSizeBottom,WindowActive,WindowMenuLocal});
  751.     UNI(w.sysGadgets,SysGadgetSet:{windowClose,windowSize,windowFlip});
  752.     UNI(w.idcmpFlags,EIDCMPFlagSet:{iWindowClose,iGadget,iMenu,iWindowSize,
  753.                                     iDrop,iSizeVerify});
  754.     w.name:="Functionplotter";
  755.   END;
  756.   PutGadValues;
  757.   GCon.newWin.menu:=Menu;
  758.  
  759.   Win:=OpenWindow(GCon.newWin^);
  760.   IF Win#NIL THEN
  761.     CurrentDraw.fPen:=I.ObtainColor(Win.screen,
  762.                                     CurrentDraw.fColor.red,
  763.                                     CurrentDraw.fColor.green,
  764.                                     CurrentDraw.fColor.blue);
  765.     CurrentDraw.bPen:=I.ObtainColor(Win.screen,
  766.                                     CurrentDraw.bColor.red,
  767.                                     CurrentDraw.bColor.green,
  768.                                     CurrentDraw.bColor.blue);
  769.  
  770.     CurrentDraw.renderMap:=
  771.            AllocBitMap(DrawArea.w,DrawArea.h,24,EGS.pixelMap,{},NIL);
  772.  
  773.     tmpRas:=AllocBitMap(128,128,1,EGS.pixelMap,{},NIL);
  774.     Win.rPort.tmpRas:=tmpRas;
  775.  
  776.     INC(DrawArea.x,Win.leftBorder);
  777.     INC(DrawArea.y,Win.topBorder);
  778.  
  779.     REPEAT
  780.       FORGET WaitPort(Win.port);
  781.       Msg:= GetMsg(Win.port);
  782.       WHILE Msg # NIL DO
  783.         IF KEY Msg.class
  784.           OF {iWindowClose} THEN
  785.             done:=TRUE
  786.           END;
  787.           OF {iSizeVerify} THEN
  788.             I.RemoveGadget(Win,GCon.first);
  789.             RemGadValues(NIL);
  790.             GB.DeleteGadContext(GCon);
  791.             IF CurrentDraw.renderMap#NIL THEN
  792.               DisposeBitMap(CurrentDraw.renderMap);
  793.               CurrentDraw.renderMap:=NIL
  794.             END;
  795.           END;
  796.           OF {iWindowSize} THEN
  797.             CreateGadgets;
  798.             INC(DrawArea.x,Win.leftBorder);
  799.             INC(DrawArea.y,Win.topBorder);
  800.             PutGadValues;
  801.             I.AddGadget(Win,GCon.first);
  802.             CurrentDraw.renderMap:=
  803.                    AllocBitMap(DrawArea.w,DrawArea.h,24,EGS.pixelMap,{},NIL);
  804.           END;
  805.           OF {iGadget},{iDrop} THEN
  806.             HandleGadgets(Msg);
  807.           END;
  808.           OF {iMenu} THEN
  809.             HandleMenus(Msg)
  810.           END;
  811.         END;
  812.         ReplyMsg(Msg);
  813.         Msg:=GetMsg(Win.port);
  814.       END
  815.     UNTIL done;
  816.   END;
  817. CLOSE
  818.   IF Win # NIL THEN
  819.     I.ReleaseColor(Win.screen,CurrentDraw.fPen);
  820.     I.ReleaseColor(Win.screen,CurrentDraw.bPen);
  821.     CloseWindow(Win);
  822.     Win:=NIL;
  823.   END;
  824.   IF tmpRas#NIL THEN
  825.     DisposeBitMap(tmpRas);
  826.     tmpRas:=NIL;
  827.   END;
  828.   IF GCon # NIL THEN
  829.     GB.DeleteGadContext(GCon);
  830.     GCon:=NIL;
  831.   END;
  832.   IF CurrentDraw.renderMap#NIL THEN
  833.     DisposeBitMap(CurrentDraw.renderMap);
  834.     CurrentDraw.renderMap:=NIL
  835.   END;
  836.   IF Menu#NIL THEN
  837.     I.FreeMenu(Menu);Menu:=NIL
  838.   END;
  839.   IF MenuFont#NIL THEN
  840.     G.CloseFont(MenuFont);MenuFont:=NIL
  841.   END;
  842.   IF RCon#NIL THEN
  843.     DeleteReqContext(RCon);
  844.   END;
  845. END FunctionPlotter.
  846.